# coding:utf-8
from extractors.base_extractor import BaseExtractor
from spidertools.utils.xpath_utils import get_alltext
from scrapy.selector import Selector
from spidertools.utils.snippets import combine_two_dict
import pymongo
import re
import time



class MongoDb(object):

    def __init__(self):
        self.my_cli = pymongo.MongoClient("mongodb://127.0.0.1:27017")
        self.my_db = self.my_cli["construction"]
        self.my_col = self.my_db["project_html"]
        self.select_url = ["http://bs.gdggzy.org.cn/osh-web/project/projectbulletin/toBullDetail?bulletinId=439a1778e2204ca4a424e68cd66ba6c8&tradeTypeId=Construction&tradeItemId=gc_res_bulletin&queryType=1",
"http://bs.gdggzy.org.cn/osh-web/project/projectbulletin/toBullDetail?bulletinId=7d3a03683c4c42dca425acac84ba486d&tradeTypeId=Construction&tradeItemId=gc_res_bulletin&queryType=1",
"http://bs.gdggzy.org.cn/osh-web/project/projectbulletin/toBullDetail?bulletinId=67b134ab833442978943d8d7c93cf0bd&tradeTypeId=Construction&tradeItemId=gc_res_bulletin&queryType=1",
"http://bs.gdggzy.org.cn/osh-web/project/projectbulletin/toBullDetail?bulletinId=4af540312c3a4a169f4d0b23d7cef08e&tradeTypeId=Construction&tradeItemId=gc_res_bulletin&queryType=1",
"http://bs.gdggzy.org.cn/osh-web/project/projectbulletin/toBullDetail?bulletinId=6d892185b2cf49b9b0fe0b0382a351c4&tradeTypeId=Construction&tradeItemId=gc_res_bulletin&queryType=1",
"http://bs.gdggzy.org.cn/osh-web/project/projectbulletin/toBullDetail?bulletinId=f300e67da6ff4b6fb1a0a900f0eb1d6a&tradeTypeId=Construction&tradeItemId=gc_res_bulletin&queryType=1",
"http://bs.gdggzy.org.cn/osh-web/project/projectbulletin/toBullDetail?bulletinId=c2d559e579494d4291bb108a729403d4&tradeTypeId=Construction&tradeItemId=gc_res_bulletin&queryType=1",
"http://bs.gdggzy.org.cn/osh-web/project/projectbulletin/toBullDetail?bulletinId=c374d4cd39b14d038ae114d783786795&tradeTypeId=Construction&tradeItemId=gc_res_bulletin&queryType=1",]

    @property
    def query_condition(self):
        # return {"source_type": "广东省全国公共资源交易平台", "公告类型": "招标公告"}
        #
        # return {"origin_url": "http://bs.gdggzy.org.cn/osh-web/project/projectbulletin/toBullDetail?bulletinId=ddee0df2-98ee-485c-a42a-8b4b0a7d7778&tradeTypeId=Construction&tradeItemId=gc_res_bulletin&queryType=1"}
        return {"origin_url": "http://bs.gdggzy.org.cn/osh-web/project/projectbulletin/toBullDetail?bulletinId=ddee0df2-98ee-485c-a42a-8b4b0a7d7778&tradeTypeId=Construction&tradeItemId=gc_res_bulletin&queryType=1"}
    # def query_condition(self, url):
    #     return {"origin_url": f"{url}"}

    def get_db_info(self):
        # for url in self.select_url:
        #     for info in self.my_col.find(self.query_condition(url)):
        #         yield info
        for info in self.my_col.find(self.query_condition):
            yield info


def time_count(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        func(*args, **kwargs)
        stop_time = time.time()
        print(stop_time-start_time, "--------",print(func))
    return wrapper


# 广东省全国公共资源交易平台
class GuangDongShengQuanGuoGongGongZiYuanJiaoYiPingTai(BaseExtractor):

    def __init__(self, info_dict):

        super(GuangDongShengQuanGuoGongGongZiYuanJiaoYiPingTai, self).__init__(info_dict)
        if self.info_dict["公告类型"] == "招标公告":
            # 迫不得已才用的的项目名称
            self.reserve_pro_name = self.sel.xpath("//div[@id='bulletinName']/text()").extract_first()

            # 锁定需要源码和文本替换的范围
            self.html = self.sel.xpath("//ul[@id='bulletinContent']").extract_first()
            # 正文替换的正则
            self.replace_dict_for_text_mdd = {
                r"发布时间:": "",
                r"阅读次数:": "",
                r'2、项目概况和招标范围:': "",
                r'2\.1项目概况:': "",
                r'2.2招标范围:': "",
                r'；传真:': "传真:",
                r'主办方名称:[\s]*\(盖单位章\)': "",
                r'网址': "",
                r'综合评分相等时,评标委员会依次按照以下优先顺序推荐中标候选人或确定中标人:': "",
                r"招标控制价(投标最高限价)金额为": "招标控制价:",
                r"招标控制价为人民币": "招标控制价:",
                r"招标控制价(最高限价)": "招标控制价:",
                r"招标控制价\(投标最高限价\)": "招标控制价:",
                r"\(1\)招标代理机构联系方式": "招标代理机构联系方式:",
                r"\(2\)招标人联系方式": "招标人联系方式:",
                r"法定代表人: +\s\(签字或盖章\)": "",
                r"招标内容、规模和招标控制价:": "",
                r'规模和招标控制价\(最高投标限价\):': "",
                r'本项目最高投标限价': "标段最高限价:",
                r'招标控制价为': '招标控制价:',
                r'招标控制价\(最高投标限价\)金额为': '招标控制价:',
                r'批准建设,': "批准建设:",
                r'住宅分A': "住宅分A:",
                r'本次招标估算价总价为': '投资金额:',
                r'本工程招标控制价为': '标段最高限价:',
                r'投诉联系人:马小姐,联系电话:020-28230371': "",
                r'\(地址:广州市天润路333号,联系人:高先生\)': "",
                r'项目负责人:须具备':'',
                r'项目经理:持有住房:':'',
                r'公告发布日期\(含本日\):':'',
                r'公告日期:':'',
                r'相关材料索取联系电话:':'',
                r'本工程实行全过程限额设计与施工':'本工程实行全过程限额设计与施工:',
                r'其中该项目投标时预备费':'其中该项目投标时预备费:',
                r'一、     招标单位':'招标单位:',
                r'二、     招标代理': '招标代理:',
                r'现诚邀合格的投标人参加投标,有关事项[公布]{0,2}如下:\s*?一、单位名称及地址:':'招标人信息:',
                r'施工单位:①':'',
                r'联合体牵头人:':'',
                r'采用批量招标方式确定5家中标人:':'',
                r'批文名称:':'',
                r'递交投标文件截止时间:':'',
                r'汕头市公共资源交易中心潮南分中心\(地址:': '汕头市公共资源交易中心潮南分中心',
                r'报名窗口\(地址:':'报名窗口'
            }

            # html替换正则
            self.replace_dict_for_html = {
                r'<p.*?>.*?附件一[：]{0,1}.*?</p>[\s\S]*':"",
                r'联合体工作协议</span>[\s\S]*':"",
                r'<p.*?>.*?联合体共同投标协议.*?</p>[\s\S]*':"",
                r'以上附件可从发布公告的网站媒[介体]{1}上下载[。]{0,1}[\s\S]*': "",
                r'资格审查资料及其他取自广州市房建和市政企业库内资料一览表[\s\S]*': "",
                r'投标登记资料一览表[\s\S]*': '',
                r'投标人业绩证明[\s\S]*': "",
                r"<span.*?>审核确认<span>:</span>招标人或招标代理机构接收资料人员与投标申请人代表对以下资料共同核对，审核情况属实。</span>[\s\S]*": "",
                r"新建深湛铁路湛江机场段预埋结构工程建管甲供物资防水板（第一批）招标计划表[\s\S]*": "",
                r'物资包件划分一览表[\s\S]*': "",
                r"附件一申请人业绩证明[\s\S]*": "",
                r'资格审查条件[(（]{1}(基本)?资质最低[\s\S]*'
                # r'资格审查条件\(资质最低要求[\s\S]*': "",
                # r'资格审查条件（资质最低[\s\S]*': "",
                # r'资格审查条件（基本资格最低要求[\s\S]*':'',
                r'资格审查条件<span>\(</span>资质最低[\s\S]*': '',
                r'资格审查条件附录[\s\S]*': '',
                r'资格审查书面资料及其他取自广州市房建和市政企业库内[\s\S]*': '',
                r'资格审查资质要求[\s\S]*': '',
                r'资质最低条件[\s\S]*': '',
                r'审核确认：招标人或招标代理机构接收资料人员与投标申请人代表对以下资料共同核对，审核情况属实。[\s\S]*': "",
                r'资格审查资质条件[\s\S]*': '',
                r'人员配备要求见下表：[\s\S]*?联合体要求': '',
                r'附件一：保密承诺书[\s\S]*': '',
                r'招标文件领取记录表[\s\S]*': '',
                r'申请人业绩证明[\s\S]*': '',
                r'投标登记申请表[\s\S]*': '',
                r'招标公告附表[\s\S]*': "",
                r'招标理机构：': '招标代理机构:',
                r'<p style="margin-top:3\.1pt;margin-right:0pt;margin-bottom:3\.1pt;margin-left:0pt;mso-para-margin-top:\.2gd;mso-para-margin-right:0pt;mso-para-margin-bottom:\.2gd;mso-para-margin-left:0pt;line-height:18\.0pt;mso-line-height-rule:exactly;layout-grid-mode:char"><span style="mso-bidi-font-size:10\.5pt;font-family:宋体;mso-bidi-font-family:宋体;color:windowtext;mso-bidi-font-weight:bold">日<span style="mso-spacerun:yes">&nbsp;&nbsp;&nbsp; </span></span>期：\d+<span style="font-family:宋体;mso-bidi-font-family:宋体;color:windowtext;mso-bidi-font-weight:bold">年<span>\d+</span>月\d+</span>日<span style="mso-bidi-font-size:10\.5pt;font-family:宋体;mso-bidi-font-family:宋体;color:windowtext;mso-bidi-font-weight:bold"></span></p>': "",
                r'<p align="left" style="margin-top:3\.1pt;margin-right:0pt;margin-bottom:3\.1pt;margin-left:0pt;mso-para-margin-top:\.2gd;mso-para-margin-right:0pt;mso-para-margin-bottom:\.2gd;mso-para-margin-left:0pt;text-align:left;line-height:20\.0pt;mso-line-height-rule:exactly;layout-grid-mode:char">日<span style="mso-bidi-font-size:10\.5pt;mso-bidi-font-weight:bold">&nbsp;&nbsp;&nbsp; </span>期：<span style="mso-bidi-font-size:10\.5pt;mso-bidi-font-weight:bold">2021</span><span style="mso-bidi-font-size:10\.5pt;font-family:宋体;mso-ascii-font-family:&quot;Times New Roman&quot;;mso-hansi-font-family:&quot;Times New Roman&quot;;mso-bidi-font-weight:bold">年</span><span>1</span>月16日</p>': "",
                r'<tr>\s*?<th>投诉受理部门</th>\s*?<td>.*?</td>\s*?<th>投诉电话</th>\s*?<td>.*?</td>\s*?</tr>\s*?<tr>\s*?<th>.*?</th>\s*?<td.*?</td>\s*?</tr>': "",
                r' &nbsp;\（资格证书编号[）]{0,1}': "&nbsp;（资格证书编号）",
                r"<td.*?>.*?信息发布时间.*?</td>.*?<td.*?>.*?</td>": "",
                r"<p.*?><span.*?>法定代表人.*?（签字或盖章）<span></span></span></p>": "",
                r"<tr.*?>\s*?<td.*?>\s.*?<p.*?>项目经理：</span></p>\s*?</td>": "<tr><td><p>项目经理1：</span></p></td>",
                r"<tr>\s*?<th>工期</th>\s*?<td.*?>.*?按招标文件.*?</td>\s*?</tr>": "",
                r"<tr>\s*?<th>其它条件</th>\s*?<td.*?>.*?</td>\s*?</tr>": '',
                r"<tr>\s*?<th>项目负责人其它条件</th>\s*?<td.*?>.*?</td>\s*?</tr>": '',
                r'<tr.*?>\s*?<td.*?>.*?招标监督部门.*?</td>\s*?</tr>': '',
            }
        elif self.info_dict["公告类型"] == "中标公告":
            self.replace_dict_for_text_sss = {
            r'建设项目工程登记号:JM\d{9}': "成交单位名称：",
            r'发布时间：\d{4}-\d{2}-\d{2}\s{1}\d{2}:\d{2}:\d{2}': "",
            r'阅读次数：\d+': "",
            r'网址[:]{0,1}http[s]{0,1}://[\.\w]+?[cnom]{2,3}[/]{0,1}': "",
            r'网址[:]{0,1}www[\.\w]+?[cnom]{2,3}[/]{0,1}': "",
            r'<tr>\s*?<th>投诉受理部门</th>\s*?<td>.*?</td>\s*?<th>投诉电话</th>\s*?<td>.*?</td>\s*?</tr>\s*?<tr>\s*?<th>.*?</th>\s*?<td.*?</td>\s*?</tr>': '',
            r'网址：http://www.gdzbtb.gov.cn': '',
            r'网址：http://zbtb.gd.gov.cn/login': '',
            r'广东省广州市天河区天润路333号广州公共资源交易中心\s*?邮编：510635。': '',
            r'河源市公共资源交易中心网（网址：http://61.143.150.176': '',
            r'投标邀请函\s*?日期：2020年2月21日\s*?投标邀请函编号：0692-202B01130028': '',
            r'请各潜在投标人在项目提疑截止时间前以匿名方式编辑提疑邮件（请务必注明项目名称）发至邮箱：stggzytydy@163.com': '',
            r'关于取消广东嘉运建设有限公司第一中标候选人资格的通知.pdf\s*?关于保留广东建洲建设工程有限公司中标候选人资格的通知.pdf\s*?广东嘉运建设有限公司对《关于取消广东嘉运建设有限公司第一中标候选人资格的通知》事项回复.pdf': '',
            r'二：中标单位情况': '二.中标单位情况',
            r'公司荣誉：\s*?①牵头人施工单位': '公司荣誉',
            r'公司业绩及奖项：\s*?联合体牵头人（施工单位）：': '公司荣誉',
            r'响应资格能力情况：\s*?联合体牵头人（施工单位）：': '公司荣誉',
            r'公司业绩及奖项：': '公司荣誉',
            r'公司业绩及奖项：\s*?联合体牵头人（施工）：': '公司荣誉',
            r'响应资格能力情况：\s*?联合体牵头人（施工）：': '公司荣誉',
            r'联合体成员（勘察、设计）': '不要',
            r'施工示范工地；（5）工程名称：': '不要',
            r'文明施工示范工地奖；（4）工程名称：': '不要',
            r'（首期）工程；（2）工程名称：': '不要',
            r'生产文明施工示范工地；（3）工程名称：圣基豪': '不要',
            r'学技术奖技术开发类二等奖。联合体牵头人（施工）': '不要',
            r'牵头人施工单位': '不要',
            r'公告发布日期': '不要',
            r'（施工单位）': '',
            r'招标人确定第一中标候选人': '招标人确定第一中标候选人：',
            '中标价为': '中标价为：',
            '中标人为': '中标人为：',
            '第一中标候选人': '第一中标候选人：',
            '招标人确定': '招标人确定：',
            '确定第一中标候选人': '确定第一中标候选人：',
        }
        print("__init__")
    @property
    def check_content_is_html(self):
        is_html = False
        if "</p>" in "".join(self.sel.xpath("//ul[@id='bulletinContent']//text()").extract()):
            f = open("乱码的url", 'a', encoding="utf-8")
            f.write(self.info_dict["origin_url"] + "\n")
            f.close()
            is_html = True
        print("check_content_is_html")
        return is_html

    def check_purchase(self):
        flag = 0
        if "采购" in self.info_dict["公告标题"]:
            flag = 1
        print("check_purchase")
        return flag


    def checkIfNeedParse(self):
        '''
        判断是不是一个有效的html
        '''
        if self.info_dict["公告类型"] == "招标公告":
            flag = 1
            text_list = self.sel.xpath("//ul[@id='bulletinContent']/text()[1]").extract()[0]
            text = text_list.strip()
            # text = "".join(list(map(lambda x: x.strip(), text_list)))
            # if not text:
            #     flag = 0
            # elif text:
            #     if text.startswith("详见"):
            #         flag = 0
            if text.startswith("详见"):
                flag = 0
            print("checkIfNeedParse")
            return flag
        elif self.info_dict["公告类型"] == "中标公告":
            flag = 1
            give_up_by_keys = ["招标方式", "招标公告", "挂牌出让", "招投标活动的公告", "资格预审公告", "投标邀请公告", "用地使用权拍卖", "失败公告"]
            page_title = self.sel.xpath("//div[@id='bulletinName']/text()").extract_first()
            content = self.sel.xpath('//*[@id="bulletinContent"]').extract_first()
            for key in give_up_by_keys:
                for val in [page_title, content]:
                    if key in val:
                        flag = 0
                    if flag == 0:
                        break
                if flag == 0:
                    break
            return flag

    def common_text_parse(self, xpath="//ul[@id='bulletinContent']"):

        if self.info_dict["公告类型"] == "招标公告":
            texts = []
            # 获取招标公告正文
            if self.check_content_is_html:
                # self.html = "".join(self.sel.xpath("//ul[@id='bulletinContent']//text()").extract())
                # self.sel = Selector(text=self.html)
                # self.replace_tag_for_html()
                # content_root_nodes = self.sel
                # node_text = get_alltext(content_root_nodes)
                # texts.append(node_text)
                return {}
            else:
                self.replace_tag_for_html()
                content_root_nodes = self.sel.xpath(xpath)
                # 遍历所有子节点，获取相应的文本
                for node in content_root_nodes:
                    node_text = get_alltext(node)
                    texts.append(node_text)

                output_dict = self.texts_matchine_parse(texts)
                print("common_text_parse")
                return output_dict
        elif self.info_dict["公告类型"] == "中标公告":
            content_root_nodes = self.sel.xpath(xpath)
            texts = []
            # 遍历所有子节点，获取相应的文本
            for node in content_root_nodes:
                node_text = get_alltext(node)
                texts.append(node_text)
            output_dict = self.texts_matchine_parse(texts)
            return output_dict

    # 对源码进行替换
    def replace_tag_for_html(self):
        if self.info_dict["公告类型"] == "招标公告":
            for k, v in self.replace_dict_for_html.items():
                print(k, v)
                self.html = re.sub(k, v, self.html)
            self.sel = Selector(text=self.html)
            print("replace_tag_for_html")
        elif self.info_dict["公告类型"] == "中标公告":
            for key in ["第一中标候选人", "第一中标候选单位", "第一候补中标人", "第一候选人"]:
                if key in self.sel.xpath('.//table/tbody'):
                    self.html = re.sub(r'>中标候选人<', '><', self.html)
                    self.html = re.sub(r'>公示内容<', '><', self.html)
            return self.html
    # 对文本进行替换
    def common_replace_word(self, text):
        '''
        对网页进行一些词条替换
        '''
        if self.info_dict["公告类型"] == "招标公告":
            for k, v in self.replace_dict_for_text_mdd.items():
                text = re.sub(k, v, text)
            print("common_replace_word")
            return text
        elif self.info_dict["公告类型"] == "中标公告":
            for k, v in self.replace_dict_for_text_sss.items():
                text = re.sub(k, v, text)
            return text

    def get_infos_from_otherway(self, result, html=None):
        if self.info_dict["公告类型"] == "招标公告":
            if "工程基本信息" not in result.keys():
                result["工程基本信息"] = {}

            if not result["工程基本信息"].get("项目名称"):
                result["工程基本信息"]["项目名称"] = self.reserve_pro_name

            if "工程招标信息" not in result.keys():
                result["工程招标信息"] = {}

            if not result["工程招标信息"].get("标段名称"):
                result["工程招标信息"]["标段名称"] = result["工程基本信息"]["项目名称"]
            print("get_infos_from_otherway")
            return result
        elif self.info_dict["公告类型"] == "中标公告":
            if "工程基本信息" not in result.keys():
                result["工程基本信息"] = {}
            if not result["工程基本信息"].get("项目名称"):
                result["工程基本信息"]["项目名称"] = self.sel.xpath("//div[@id='bulletinName']/text()").extract_first()

            if "工程招标信息" not in result.keys():
                result["工程招标信息"] = {}

            if not result["工程招标信息"].get("标段名称"):
                result["工程招标信息"]["标段名称"] = result["工程基本信息"]["项目名称"]

            if result.get("工程投标信息"):
                for res in result['工程投标信息']:
                    if not res.get("中标信息名称"):
                        re_list = ['经确定，(.*?)为本项目的中标单位', r'（主）(.*?)\n?、?（']
                        for re_demo in re_list:
                            s = re.findall(re_demo, self.get_all_text_sss())
                            for a in s:
                                if a:
                                    if type(a) is str:
                                        res['中标信息名称'] = a
            return result

    def commom_announcement_parse(self):
        '''
        通用网页公告解析
        :return:
        '''
        print("commom_announcement_parse_start")
        if self.info_dict["公告类型"] == "招标公告":
            tds = self.sel.xpath("//tbody[@id='aulletinAttachment']//td").extract()
            if len(tds) > 100: return {}
            text_parsed_dicts = self.common_text_parse()
            table_parsed_dicts = self.common_table_parse()
            output = {}
            if text_parsed_dicts:
                output = combine_two_dict(output, text_parsed_dicts)
            if table_parsed_dicts:
                output = combine_two_dict(output, table_parsed_dicts)
            print("commom_announcement_parse_end")
            return output
        elif self.info_dict["公告类型"] == "中标公告":
            dict_dome = {}
            self.sel = Selector(text=self.replace_tag_for_html())
            text_parsed_dicts = self.common_text_parse('//*[@id="bulletinContent"]')
            if not text_parsed_dicts:
                dict_dome['Repeat_information'] = 1  # 有值就不会检测
                return dict_dome
            table_parsed_dicts = self.common_table_parse()
            output = {}
            if text_parsed_dicts:
                output = combine_two_dict(output, text_parsed_dicts)
            if table_parsed_dicts:
                output = combine_two_dict(output, table_parsed_dicts)
            return output

    def common_table_parse(self):
        if self.info_dict["公告类型"] == "招标公告":
            output_dict = {}
            tables = self.sel.xpath("//ul[@id='bulletinContent']//table")
            for table in tables:
                if not self.judge_need_table(table):
                    continue
                result = self.table_extract_machine.run_table(table)
                output_dict = combine_two_dict(output_dict, result)
            print("common_table_parse")
            return output_dict
        elif self.info_dict["公告类型"] == "中标公告":
            output_dict = {}
            tables = self.get_tables_sss(self.sel)
            for table in tables:
                result = self.table_extract_machine.run_table(table)
                output_dict = combine_two_dict(output_dict, result)
            return output_dict

    def get_all_text_sss(self):
        sel = Selector(text=self.html)
        return "".join(sel.xpath('//text()').extract())
    @staticmethod
    def get_tables_sss(root_node):
        table_list = root_node.xpath('.//table')
        table = table_list.get()
        if table:
            zhongbiao_nicheng = ['第一中标候选人', '第一中标候选单位', '第一候补中标人', '第一候选人']
            for zhongbiao in zhongbiao_nicheng:
                if zhongbiao in table:
                    table = table.replace('单位名称', '中标单位名称')
            table = Selector(text=table)
            table_node = table.xpath('//table')
            table_list[0] = table_node[0]
        return table_list

    # 通过td里是否都含有：or:来判断是否需要表格解析,针对如下情况，只走文本解析
    # -----------------------------针对于kv在一个td里---------------------------
    # | ------------------------------# |----------------------------------# |
    # |   招标人:佛山市南海区桂城街道办事处 # | 招标代理机构：广东致正项目管理有限公司  # |
    # | ------------------------------# | ---------------------------------# |
    # |地址：佛山市南海区桂城街道南港路10号 # | 地 址：佛山市南海区桂城街道庆安路6号    # |
    # | ------------------------------# | ---------------------------------# |
    # |       邮 编：528200            # |   邮 编：528200                   # |
    # | ------------------------------# | ---------------------------------# |
    # |      联 系 人：何先生            # |   联 系 人：余远胜、黄德星           # |
    # | ------------------------------# | ---------------------------------# |
    @staticmethod
    def judge_need_table(table_node):
        flag = True
        count = 0
        for i in table_node.xpath(".//td"):
            if list(filter(lambda x: x in [":", "："], "".join(i.xpath(".//text()").extract()).strip())):
                count += 1

        if count >= 4:
            flag = False
        print("judge_need_table")
        return flag

    def clean_dict_keys(self,result):
        if self.info_dict["公告类型"] == "招标公告":

            result["工程招标信息"]["标段名称"] = result["工程招标信息"]["标段名称"].replace("招标公告", "").replace("公告", "")
            result["工程基本信息"]["项目名称"] = result["工程基本信息"]["项目名称"].replace("招标公告", "").replace("公告", "")

            # 工期替换正则列表
            pro_period_res = [r'^\d+[个]{0,1}日历天', r'^总工期为\d+[个]{0,1}日历天']
            if result.get("工程基本信息").get("工程基本信息工期") and len(result["工程基本信息"]["工程基本信息工期"]) > 100:
                for re_ in pro_period_res:
                    s = re.search(re_, result["工程基本信息"]["工程基本信息工期"])
                    if s:
                        result["工程基本信息"]["工程基本信息工期"] = s.group()

            if result.get("未知") and result.get("未知").get("未知日期"): del result["未知"]["未知日期"]

            if result.get("未知") and result.get("未知").get("未知发布时间"): del result["未知"]["未知发布时间"]

            if result.get("工程招标信息") and result.get("工程招标信息").get("招标代理机构邮箱"):
                if "年" in result.get("工程招标信息").get("招标代理机构邮箱")[0]:
                    del result["工程招标信息"]["招标代理机构邮箱"]

            if result["工程基本信息"].get("项目编号"): result["工程基本信息"]["项目编号"] = result["工程基本信息"]["项目编号"].split(")")[0].split("；")[0]

            result = self.to_iterate_over(result)
            print("clean_dict_keys")
            return result
        elif self.info_dict["公告类型"] == "中标公告":
            return result

    @staticmethod
    def replace_some_space_and_so_on(info):
        val = info.replace("\xa0", "").replace(" ", "").replace(" ", "").strip()
        val = val.split("。")[0]
        return val

    # 递归遍历嵌套列表或者字典,对v进行一些清洗操作
    def to_iterate_over(self, result):
        if isinstance(result, dict):
            for x in range(len(result)):
                key = list(result.keys())[x]
                result[key] = self.to_iterate_over(result[key])
            return result

        elif isinstance(result, list):
            for x in range(len(result)):
                result[x] = self.to_iterate_over(result[x])
            return result
        else:
            return self.replace_some_space_and_so_on(result)


if __name__ == '__main__':
    m = MongoDb()
    for info in m.get_db_info():
        print(info["origin_url"])
        g = GuangDongShengQuanGuoGongGongZiYuanJiaoYiPingTai(info_dict=info)
        output_result = g.output_extractor_dict(use_new=True)
